#include <iostream>
#include <cerrno>
#include <fcntl.h>
#include <unistd.h>
#include <cstdlib>

//对指定的fd设置非阻塞，在epoll的ET模式下，要求fd是非阻塞的。
void SetNonBlock(int fd)
{
    int f1 = fcntl(fd, F_GETFL);
    if(f1 < 0){
        std::cerr << "fctnl error~" << std::endl;
        exit(0);
    }
    fcntl(fd, F_SETFL, f1 | O_NONBLOCK);
}
int main()
{    
    SetNonBlock(0);
    while(true)
    {
        char buf[1024];
        ssize_t s = read(0, buf, sizeof(buf) - 1);
        if(s > 0)
        {
            buf[s] = 0;
            std::cout << "echo# " << buf << std::endl;
        }else if (s == 0)
        {
            std::cout << "end stdin" << std::endl;
            break;
        }else{
            // 非阻塞等待， 如果数据没有准备好，返回值会按照出错返回, s == -1
            // 数据没有准备好 vs 真的出错了 ： 处理方式一定不是一样的。 s无法区分！
            // 数据没有准备好，算读取错误吗？不算。read，recv以出错的形式告知上层，数据还没有准备好
            if(errno == EWOULDBLOCK){
                std::cout << "os的底层数据还没有准备好~,error:" << errno << std::endl;
            }
            else if(errno == EINTR)
            {
                std::cout << "IO interrupted by signal, try again" << std::endl;
            }
            else
            {
                std::cout << "read error!" << std::endl;
                break;
            }
        }
        sleep(1);
    }
}